home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / ARGONET / PD / SOUND / REPLAYER.SPK / h / replaydriv next >
Text File  |  1998-08-24  |  7KB  |  179 lines

  1.  
  2. /* replaydriver.h */
  3. /* A veneer to the Replay sound drivers. */
  4.  
  5. #ifndef lib_replaydriver_H
  6. #define lib_replaydriver_H
  7.  
  8. #include <stdlib.h>
  9.  
  10. #ifdef __cplusplus
  11. extern "C" {
  12. #endif
  13.  
  14.  
  15. /* Private declarations for macros later. */
  16. extern void replaydriver_veneer(unsigned r0, unsigned r1, void *driver);
  17.  
  18.  
  19. /* A structure covering the driver's header.  Don't rely on contents or use
  20.    them directly; use the macros below. */
  21. typedef struct replaydriver_driver replaydriver_driver;
  22. struct replaydriver_driver {
  23.   unsigned play, stop, feed;    /* Entry points. */
  24.   int interface_flags;        /* Flags about the driver. */
  25.   void *buffer[2];        /* Buffer addresses. */
  26.   unsigned unsure[3];        /* Not used? */
  27.   int timer_int,        /* Integer part of current time. */
  28.       timer_fract;        /* Fractional part of current time. */
  29. };
  30.  
  31. /* The important Replay control block, used by the sound drivers.  The
  32.    contents of this are public. */
  33. typedef union replaydriver_control replaydriver_control;
  34. union replaydriver_control {
  35.   char mute[64]; /* Called "mute" for hysterical raisins. */
  36.   struct {
  37.     int flags,           /* Allow pausing or muting of sound. */
  38.         skip_late_data,       /* If set, skip late data. */
  39.         replay_rate_int,   /* Integer portion of the frequency in Hz. */
  40.         replay_rate_fract; /* Fractional part of the frequency * 1<<24. */
  41.     char quality,       /* Quality to play sound, from 1--4. */
  42.          reversed;       /* If set, reverse left and right channels. */
  43.   } data;
  44.   /* Our code also stores some extra state after the 64 bytes, rather than
  45.      creating a whole new block. */
  46.   struct {
  47.     char mute[64];
  48.     int next_buffer;    /* The next buffer to become empty (0 or 1). */
  49.   } extra;
  50. };
  51.  
  52. /* Information about the sound buffers allocated.  Contents private. */
  53. typedef struct replaydriver_buffer replaydriver_buffer;
  54. struct replaydriver_buffer {
  55.   size_t single_size;    /* Size of each sound buffer. */
  56.   void *buffer;        /* Address of the beginning of the buffers. */
  57.   int dynarea;        /* Dynamic area of buffer; -1 for using RMA. */
  58.   size_t temp_size;    /* Size of temp block allocated (0 for none). */
  59. };
  60.  
  61. /* Flags */
  62. #define replaydriver_PAUSE    (1 << 0)
  63. #define replaydriver_MUTE    (1 << 1)
  64.  
  65. /* Other info */
  66. #define replaydriver_BUFFER_CHECK_WORD    0x1BADDEED
  67. #define replaydriver_DRIVER_PREFIX    "<ARMovie$SoundDir>."
  68.  
  69.  
  70. /* Initialisation and finalisation. */
  71.  
  72. /* Loading and freeing drivers. */
  73. replaydriver_driver *replaydriver_load(const char *filename);
  74. void replaydriver_destroy(replaydriver_driver *driver);
  75.  
  76. /* Loading and freeing control blocks. */
  77. replaydriver_control *replaydriver_control_create(void);
  78. void replaydriver_control_destroy(replaydriver_control *control);
  79.  
  80.  
  81. /* Methods for fiddling with the driver's header and using entry points. */
  82.  
  83. /* Sound driver entry points. */
  84. /* For public use. */
  85. #define replaydriver_play(driver, control)            \
  86.     replaydriver_play_entry(driver, control, 2)
  87. void replaydriver_stop(replaydriver_driver *driver,
  88.     replaydriver_control *control);
  89. /* For internal use. */
  90. #define replaydriver_play_entry(driver, control, param)        \
  91.     if((driver) && (control))                \
  92.       replaydriver_veneer((param), (unsigned) (control),    \
  93.         (void *) &(driver)->play)
  94.  
  95. /* Performing the sound timing check. */
  96. /* The state type may be initialised to zero, and then will be true only
  97.    when a sound check is in progress. */
  98. typedef int replaydriver_timecheck_state;
  99. void replaydriver_timecheck_start(replaydriver_driver *driver,
  100.     replaydriver_control *control, replaydriver_timecheck_state *state);
  101. void replaydriver_timecheck_finish(replaydriver_driver *driver,
  102.     replaydriver_control *control, replaydriver_timecheck_state *state);
  103. void replaydriver_timecheck_abort(replaydriver_driver *driver,
  104.     replaydriver_control *control, replaydriver_timecheck_state *state);
  105.  
  106. /* Read the driver's flags. */
  107. #define replaydriver_NO_SOUND_CHECK    (1 << 0)
  108. #define replaydriver_QUALITY_EXPENSIVE    (1 << 1)
  109. #define replaydriver_get_flags(driver)    \
  110.     ((driver) ? ((const int) (driver)->interface_flags) : 0)
  111.  
  112. /* Set sound rate (in Hz, floating point) in control block. */
  113. #define replaydriver_set_rate(control, rate)                \
  114.     ((control) ?                            \
  115.      ((control)->data.replay_rate_int = (int) (rate),        \
  116.       (control)->data.replay_rate_fract =                \
  117.         (int) (((rate) - (int) (rate)) * (1<<24))) : 0,        \
  118.      (void) 0)
  119.  
  120. /* Set or read buffer locations. */
  121. /* There are 2 sound buffers, so the number can be 0 or 1. */
  122. #define replaydriver_set_buffer(driver, buffer_no, block)        \
  123.     ((driver) ? (driver)->buffer[buffer_no] = (block) : 0)
  124. #define replaydriver_get_buffer(driver, buffer_no)            \
  125.     ((void * const) (driver)->buffer[buffer_no])
  126. /* Returns a pointer to the buffer empty flag. */
  127. #define replaydriver_buffer_empty(driver, buffer_no)            \
  128.     (&((int *) replaydriver_get_buffer((driver), (buffer_no)))[1])
  129.  
  130. /* Sound buffer allocation. */
  131. replaydriver_buffer *replaydriver_buffer_create(int single_size,
  132.     replaydriver_driver *driver);
  133. void replaydriver_buffer_destroy(replaydriver_buffer *buffer);
  134. /* Checking buffer integrity (uses check word at end).  Non-zero for fail. */
  135. #define replaydriver_buffer_check(buffer_obj)            \
  136.     ((*(int *) ((char *) (buffer_obj)->buffer +        \
  137.         (buffer_obj)->single_size)            \
  138.         != replaydriver_BUFFER_CHECK_WORD) ||        \
  139.      (*(int *) ((char *) (buffer_obj)->buffer +        \
  140.         ((buffer_obj)->single_size * 2) + 4)        \
  141.         != replaydriver_BUFFER_CHECK_WORD))
  142.  
  143. /* Allocation of temporary space. */
  144. void *replaydriver_temp_alloc(replaydriver_buffer *buffer, size_t size);
  145. void replaydriver_temp_free(replaydriver_buffer *buffer, void *block);
  146.  
  147. /* Feeding data, and checking whether a buffer is empty. */
  148. #define replaydriver_is_hungry(driver)                    \
  149.     (((int *) replaydriver_get_buffer((driver), 0))[1] ||        \
  150.      ((int *) replaydriver_get_buffer((driver), 1))[1])
  151. #define replaydriver_buffers_empty(driver)                \
  152.     (((int *) replaydriver_get_buffer((driver), 0))[1] &&        \
  153.      ((int *) replaydriver_get_buffer((driver), 1))[1])
  154. void replaydriver_feed(replaydriver_driver *driver,
  155.     replaydriver_control *control, void *data, size_t size);
  156. /* Get a poll word. */
  157. #define replaydriver_get_poll_word(driver, control)            \
  158.     ((const int *) replaydriver_buffer_empty((driver),        \
  159.         (control)->extra.next_buffer))
  160.  
  161. /* Reading time info. */
  162. /* These return the integer and fractional parts of the driver's record. */
  163. #define replaydriver_get_time_int(driver)                \
  164.     ((const int) (driver)->timer_int)
  165. #define replaydriver_get_time_fract(driver)                \
  166.     ((const int) (driver)->timer_fract)
  167. /* This returns the time in centiseconds given driver and control blocks. */
  168. #define replaydriver_get_time(driver, control)                \
  169.  ((int) ((double) replaydriver_get_time_int((driver)) * 100 /        \
  170.     ((double) (control)->data.replay_rate_int +            \
  171.      (double) (control)->data.replay_rate_fract / (1<<24))))
  172.  
  173.  
  174. #ifdef __cplusplus
  175. }
  176. #endif
  177.  
  178. #endif
  179.